/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package adbus.models;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.LinkedList;

/**
 *
 * @author Kasia
 */
/**główna klasa LiniaTable*/
public class LiniaTable extends Table {
    
    protected Linia line = new Linia();

    protected LinkedList<Linia> lineList = null;
    /**metoda pobierająca liste linii*/
    public void pobierzListe() {
        lineList = line.pobierz();
        fireTableDataChanged();
    }

    @Override
    /**metoda zwracająca liste lini z tabeli Linie wraz z nazwami przewoźników z tabeli Przewoźnicy*/
    public String basicQuery() {
        return "SELECT l.id_linia,l.nr_lini, p.nazwa, 'hejka', l.dzienny, l.nocny, l.robocze, l.weekendy " +
                "FROM Linie l INNER JOIN Przewoźnicy p ON l.id_przewoźnik = p.id_przewoźnik ";// +
                //"INNER JOIN Trasy t ON l.id_linia = t.id_linia ";// +
                //"INNER JOIN Słowa_kluczowe s ON s.id_słowo = t.id_słowo";
    }
    /**konstruktor klasy LiniaTable*/
    public LiniaTable() {
        super();
        zaladuj();
        pobierzListe();
    }
    /**metoda zwracająca długość listy linii*/
    public int getRowCount() {
        try {
            return result.last() ? result.getRow() : 0;
        } catch (SQLException ex) {
            try {
                if (result.isClosed()) {
                    zaladuj();
                    return result.last() ? result.getRow() : 0;
                } else {
                    Logger.getLogger(LiniaTable.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (SQLException ex1) {
                Logger.getLogger(LiniaTable.class.getName()).log(Level.SEVERE, null, ex1);
            }
            return 0;
        }
    }
    @Override
     /**metoda ustawiająca nazwy kolumn w wyświetlanej tabelce linii*/
    public String getColumnName(int index) {
        System.out.println("Chcę dostać nazwę o idx: "+index);
        switch(index) {
            case 0: return "ID";
            case 1: return "Linia";
            case 2: return "Przewoźnik";
            case 3: return "Trasa";
            case 4: return "Dzień";
            case 5: return "Noc";
            case 6: return "Pn-Pt";
            case 7: return "So-Nd";
            default: return "";
        }
    }
      /**metoda zwracająca liczbe kolumn tabeli linii*/
    public int getColumnCount() {
        return 8;
    }
     /**metoda wstawiająca dane do wyświetlanej tabelki linii*/
    public Object getValueAt(int rowIndex, int columnIndex) {
        try {
            result.first();
            result.absolute(rowIndex + 1);
            if(columnIndex == 3)
            {
                int id = result.getInt(1);
                Linia linia = new Linia();
                linia.pobierzWgId(id);
                return linia.getTags();
            }
            else
                return result.getObject(columnIndex + 1);
        } catch (SQLException ex) {
            Logger.getLogger(LiniaTable.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }
    @Override
    public Class getColumnClass(int c) {
        if(c>=4 && c<=7)
            return Boolean.class;
        else
            return String.class;
    }
     /**metoda odpowiedzialna za filtrowanie lini po jej numerze*/
    public void setNumberLineFilter(String number) {
        if(number.equals("")) {
            filters.remove("number");
            filters.remove("number");
        } else {
            filters.put("number", "nr_lini LIKE ?");
            filtersval.put("number","%"+number+"%");
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini po nazwie przewoźnika*/
    public void setCarrierFilter(String name) {
        if(name.equals("")) {
            filters.remove("name");
        } else {
            filters.put("name", "p.nazwa LIKE ?");
            filtersval.put("name","%"+name+"%");
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini po słowie z trasy*/
    public void setWordFilter(String word) {
        if(word.equals("")) {
            filters.remove("word");
            filtersval.remove("word");
        } else {
            filters.put("word", "trasa LIKE ?");
            filtersval.put("word","%"+word+"%");
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini po numerze pojazdu*/
    public void setNumberVehicleFilter(String number) {
        if(number.equals("")) {
            filters.remove("numberv");
            filtersval.remove("numberv");
        } else {
            filters.put("numberv", "l.id_linia = (SELECT id_linia From Pojazdy WHERE nr_pojazdu = ?)");
            filtersval.put("numberv",number);
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini po typie pojazdu*/
    public void setTypeFilter(Typ type) {
        if(type.id_typ!=0) {
            filters.put("type", "EXISTS (SELECT poj.id_pojazd FROM " +
                    "Pojazdy poj JOIN Modele_pojazdów mp ON poj.id_modelu = mp.id_modelu " +
                    " WHERE mp.id_typ = ? AND poj.id_linia = l.id_linia)");
            filtersval.put("type",type.id_typ);
        } else {
            filters.remove("type");
            filtersval.remove("type");
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini po modelu pojazdu*/
    public void setModelFilter(Model model) {
        if(model.id_modelu!=0) {
            filters.put("id_model", "EXISTS (SELECT id_pojazd FROM Pojazdy WHERE id_modelu = ? AND id_linia = l.id_linia)");
            filtersval.put("id_model",model.id_modelu);
        } else {
            filters.remove("id_model");
            filtersval.remove("id_model");
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini wg tego czy dzienny*/
    public void setDailyFilter(Boolean day) {
        if(day==null) {
            filters.remove("day");
            filtersval.remove("day");
        } else {
            filters.put("day", "dzienny = ?");
            filtersval.put("day",day?1:0);
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini wg tego czy nocny*/
    public void setNightFilter(Boolean night) {
        if(night==null) {
            filters.remove("night");
            filtersval.remove("night");
        } else {
            filters.put("night", "nocny = ?");
            filtersval.put("night",night?1:0);
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini wg tego czy kursuje w weekendy*/
    public void setWeekendFilter(Boolean weekend) {
       if(weekend==null) {
            filters.remove("weekend");
            filtersval.remove("weekend");
        } else {
            filters.put("weekend", "weekendy = ?");
            filtersval.put("weekend",weekend?1:0);
        }
    }
    /**metoda odpowiedzialna za filtrowanie lini wg tego czy kursuje w tygodniu*/
    public void setWeekFilter(Boolean week) {
        if(week==null) {
            filters.remove("week");
            filtersval.remove("week");
        } else {
            filters.put("week", "robocze = ?");
            filtersval.put("week",week?1:0);
        }
    }
    /**metoda odpowiedzialna za usuwanie lini z listy*/
    public void delete(int i) {
        Linia l = lineList.get(i);
        lineList.remove(i);
        l.delete();
        fireTableDataChanged();
    }
    /**metoda odpowiedzialna za filtrowanie lini po id przewoznika*/
    public void setCarrierFilter(Przewoznik przewoznik) {
        if(przewoznik.id_przewoźnik == null) {
            filters.remove("carrier");
            filtersval.remove("carrier");
        } else {
            filters.put("carrier","l.id_przewoźnik = ?");
            filtersval.put("carrier", przewoznik.id_przewoźnik);
        }
    }
}